﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioEdificios : UserControl
    {
        /// <summary>
        /// Estado de la aplicación para saber si perderemos datos.
        /// </summary>
        private string estado = "editar";
        public string Estado
        {
            get { return estado; }
            set { estado = value; }
        }

        private ArrayList lista;

        /// <summary>
        /// Instancia del formmulario, es lo que el resto de instancias podrá ver desde fuera.
        /// </summary>
        private static readonly formularioEdificios instancia = new formularioEdificios();

        private const int tam = 3;

        public static formularioEdificios Instancia
        {
            get { return instancia; }
        }

        private bool cambio;

        /// <summary>
        /// Número de páginas para la paginación.
        /// </summary>
        private int rowsPaginas;
        public int RowsPaginas
        {
            get { return rowsPaginas; }
            set { rowsPaginas = value; }
        }

        /// <summary>
        /// Página actual
        /// </summary>
        private int pagina;
        public int Pagina
        {
            get { return pagina; }
            set { pagina = value; }
        }

        public formularioEdificios()
        {
            InitializeComponent();

            cambio = true;
            estado = "editar";
            rowsPaginas = 5;
            pagina = 1;

            MuestraForm(formularioEdificioEditar.Instancia);
        }

        private void formularioEdificios_Load(object sender, EventArgs e)
        {
            // Cogemos la información de la base de datos y la metemos en el dgv
            // Para ello usaremos una función auxiliar que nos será útil para llamarla desde otros lugares.

            if (cambio)
            {
                RellenaDGV(false, pagina, rowsPaginas);
                cambio = false;
            }
        }

        /// <summary>
        /// Rellena el dataGrid con la información de la búsqueda.
        /// </summary>
        /// <param name="lista"></param>
        public void RellenaDGVBuscar(ArrayList lista)
        {
            int numFilas = 0;
            dgvEdificios.Rows.Clear();      // Borra el dgv y lo vuelve a cargar.
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\edificios\";
            int i = 0;
            foreach (ENEdificio ed in lista)
            {
                if (i == 0)
                {
                    formularioEdificioEditar.Instancia.Ed = ed;
                    if (ed != null)
                    {
                        formularioEdificioEditar.Instancia.Ed = CADEdificio.Instancia.getEdificio(ed.Nombre);
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioEdificioEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioEdificioEditar.Instancia.cargarDatos(ed.Nombre.ToString(), ed.Defensa.ToString(), ed.Tipo.ToString(), ed.Ataque.ToString(), ed.Descripcion.ToString());
                    }
                }
                i++;
                dgvEdificios.Rows.Add(1);
                try
                {
                    dgvEdificios.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + ed.Nombre + ".png");
                }
                catch (Exception)
                {
                    dgvEdificios.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;

                }
                dgvEdificios.Rows[numFilas].Cells[1].Value = ed.Nombre.ToString();
                numFilas++;
            }
        }

        /// <summary>
        /// Rellena el dataGrid con toda la información.
        /// </summary>
        /// <param name="nuevo"></param>
        /// <param name="pagina"></param>
        /// <param name="tamano"></param>
        public void RellenaDGV(bool nuevo, int pagina, int tamano)
        {
            int numFilas = 0;
            lista = CADEdificio.Instancia.getEdificios();
            dgvEdificios.Rows.Clear();      // Borra el dgv y lo vuelve a cargar.
            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            formularioEdificioEditar.Instancia.Ed = new ENEdificio();

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\edificios\";
            int i = 0;
            foreach (ENEdificio ed in lista)
            {
                if (i == 0 && nuevo == false)
                {
                    formularioEdificioEditar.Instancia.Ed = ed;
                    if (ed != null)
                    {
                        formularioEdificioEditar.Instancia.Ed = CADEdificio.Instancia.getEdificio(ed.Nombre);
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioEdificioEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioEdificioEditar.Instancia.cargarDatos(ed.Nombre.ToString(), ed.Defensa.ToString(), ed.Tipo.ToString(), ed.Ataque.ToString(), ed.Descripcion.ToString());
                    }
                }
                i++;
                dgvEdificios.Rows.Add(1);
                try
                {
                    dgvEdificios.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + ed.Nombre + ".png");
                }
                catch (Exception)
                {
                    dgvEdificios.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.ImgNoEncontrada;

                }

                dgvEdificios.Rows[numFilas].Cells[1].Value = ed.Nombre.ToString();
                numFilas++;
            }

            if (lista.Count == 0)
            {
                formularioEdificioEditar.Instancia.BorraForm();
            }

            if (formularioEdificioEditar.Instancia.Ed == null)
            {
                formularioEdificioEditar.Instancia.Ed = new ENEdificio();
                formularioEdificioEditar.Instancia.BorraForm();
            }

            if (nuevo == true)
            {
                // seleccionamos el recien creado
                dgvEdificios.SelectedRows[0].Selected = false;
                dgvEdificios.Rows[dgvEdificios.Rows.Count - 1].Selected = true;
                
            }
        }

        /// <summary>
        /// Evento que se dispara cuando haces click en una celda del dataGrid, sirve para cargar los datos
        /// en el formulario
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvEdificios_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            if (estado == "editando")
            {
                if (MessageBox.Show("Si selecciona otro edificio, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    if (e.RowIndex >= 0)
                    {
                        // Obtenemos la información de la unidad.
                        string nombreEdificio = dgvEdificios.Rows[e.RowIndex].Cells[1].Value.ToString();
                        formularioEdificioEditar.Instancia.Ed = CADEdificio.Instancia.getEdificio(nombreEdificio);

                        ENEdificio ed = formularioEdificioEditar.Instancia.Ed;

                        // Comprobamos si la unidad existe.
                        if (ed != null)
                        {
                            // Pasamos al estado de edición.
                            estado = "editar";

                            // Cargamos el formulario de edición.
                            MuestraForm(formularioEdificioEditar.Instancia);

                            // Completamos la información del formulario.
                            formularioEdificioEditar.Instancia.cargarDatos(ed.Nombre.ToString(), ed.Defensa.ToString(), ed.Tipo.ToString(), ed.Ataque.ToString(), ed.Descripcion.ToString());
                        }
                        else
                        {
                            // Mostramos un error.
                           
                        }
                    }
                }
                else
                {
                    dgvEdificios.ClearSelection();
                    //MessageBox.Show( ((DataGridView) sender).SelectedRows[0].Index.ToString() + " " + e.RowIndex.ToString());
                }
            }
            else
            {
                if (e.RowIndex >= 0)
                {
                    // Obtenemos la información de la unidad.
                    string nombreEdificio = dgvEdificios.Rows[e.RowIndex].Cells[1].Value.ToString();
                    formularioEdificioEditar.Instancia.Ed = CADEdificio.Instancia.getEdificio(nombreEdificio);

                    ENEdificio ed = formularioEdificioEditar.Instancia.Ed;

                    // Comprobamos si la unidad existe.
                    if (ed != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioEdificioEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioEdificioEditar.Instancia.cargarDatos(ed.Nombre.ToString(), ed.Defensa.ToString(), ed.Tipo.ToString(), ed.Ataque.ToString(), ed.Descripcion.ToString());
                    }
                    else
                    {
                        // Mostramos un error.

                    }
                }
            }
        }

        /// <summary>
        /// Función que muestra un userControl en el panel.
        /// </summary>
        /// <param name="o"></param>
        public void MuestraForm(UserControl o)
        {
            pEdificios.Controls.Clear();
            pEdificios.Controls.Add(o);
            o.Dock = DockStyle.Fill;
        }

        private void pEdificios_Paint(object sender, PaintEventArgs e)
        {

        }

        private void btAnadir_Click(object sender, EventArgs e)
        {
            if (estado != "editar")
            {
                MuestraForm(formularioEdificioEditar.Instancia);
            }

            // Vaciamos el formulario para que el usuario pueda insertar el nuevo edificio.

            formularioEdificioEditar.Instancia.BorraForm();
        }

        /// <summary>
        /// Función que llama a los CAD para eliminar los edificios seleccionados.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btEliminar_Click(object sender, EventArgs e)
        {
            ArrayList seleccionados = new ArrayList();
            int seleccionadas = dgvEdificios.SelectedRows.Count;
            if(seleccionadas <1)
            {
                MessageBox.Show("Debe seleccionar algún edificio primero.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
            }
            else if (seleccionadas == 1)
            {
                string nombreEdificio = dgvEdificios.SelectedRows[0].Cells[1].Value.ToString();
                if (MessageBox.Show("¿Desea eliminar el edificio " + nombreEdificio + "?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    string destino = Application.ExecutablePath;
                    destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                    destino += @"\imagenes\edificios";
                    destino += @"\" + dgvEdificios.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                    // Código para trasladar la imágen también a la web.
                    string destinoWeb = Application.ExecutablePath;
                    destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                    destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\unidades";
                    destinoWeb += @"\" + dgvEdificios.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                    formularioEdificioEditar.Instancia.pbImagenEd.Image.Dispose();
                    formularioEdificioEditar.Instancia.pbImagenEd.Image = null;

                    estado = "editar";

                    ((Image)dgvEdificios.SelectedRows[0].Cells[0].Value).Dispose();

                    System.GC.Collect();
                    System.GC.WaitForPendingFinalizers();


                    CADEdificio.Instancia.EliminaEdificio(dgvEdificios.SelectedRows[0].Cells[1].Value.ToString());

                    RellenaDGV(false, pagina, rowsPaginas);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja el edificio " + nombreEdificio + ".";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);

                    File.Delete(destino);
                    File.Delete(destinoWeb);
                }
            }
            else
            {
                if (MessageBox.Show("¿Desea eliminar " + seleccionadas + " edificios?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    int i = 0;

                    estado = "editar";

                    foreach (DataGridViewRow r in dgvEdificios.SelectedRows)
                    {
                        string destino = Application.ExecutablePath;
                        destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                        destino += @"\imagenes\edificios";
                        destino += @"\" + r.Cells[1].Value.ToString() + ".png";

                        // Código para trasladar la imágen también a la web.
                        string destinoWeb = Application.ExecutablePath;
                        destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                        destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\unidades";
                        destinoWeb += @"\" + r.Cells[1].Value.ToString() + ".png";

                        CADEdificio.Instancia.EliminaEdificio(r.Cells[1].Value.ToString());

                        if (formularioEdificioEditar.Instancia.pbImagenEd.Image != null)
                        {
                            formularioEdificioEditar.Instancia.pbImagenEd.Image.Dispose();
                        }

                        ((Image)r.Cells[0].Value).Dispose();

                        System.GC.Collect();
                        System.GC.WaitForPendingFinalizers();

                        File.Delete(destino);
                        File.Delete(destinoWeb);

                        i++;
                    }
                    
                    RellenaDGV(false, pagina, rowsPaginas);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja " + seleccionadas + " edificios.";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);
                }
            }
            // Actualizamos el DGV de bienvenida.
            formularioBienvenida.Instancia.actualizaResumen();
        }

        private void dgvEdificios_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

        private void formularioEdificios_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }
        
        /*

         * ESTO ERAN FUNCIONES DE PAGINACIÓN, COMO DE MOMENTO NO HAY, SE COMENTAN
         * 
        private void button1_Click(object sender, EventArgs e)
        {
            if (dgvEdificios.Rows.Count == 5)
            {
                pagina++;
                RellenaDGV(false, pagina, rowsPaginas);
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (pagina > 1)
            {
                pagina--;
                RellenaDGV(false, pagina, rowsPaginas);
            }
        }
         * */
    }
}
